@using AntDesign.Internal
@using AntDesign.Select.Internal
@namespace AntDesign
@inherits SelectBase<TItemValue, TItem>
@typeparam TItemValue
@typeparam TItem

@{
    base.BuildRenderTree(__builder);
}

@code
{
        RenderFragment SelectOptionsRender()
        {
#if NET5_0_OR_GREATER
            if(EnableVirtualization)
            {
                return @<Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize
                    Items=@SortedSelectOptionItems.Where(x => !x.IsHidden).ToList()
                    ChildContent="optionRender(ItemTemplate)"/>;
            }
#endif

            return @<ForeachLoop Items=@SortedSelectOptionItems  ChildContent="optionRender(ItemTemplate)" />;
        }


     Func<RenderFragment<TItem>, RenderFragment<SelectOptionItem<TItemValue, TItem>>> optionRender = 
        itemTemplate => option =>
        @<CascadingValue Value=@itemTemplate Name="ItemTemplate">
            <CascadingValue Value="@option.InternalId" Name="InternalId">
                <SelectOption @key="@option.InternalId"
                    TItemValue="TItemValue"
                    TItem="TItem">
                </SelectOption>
            </CascadingValue>
        </CascadingValue>;

    protected override RenderFragment RenderOptionDropdown()
    {
        @if (SelectOptions != null)
        {
            return @<div class="" style="max-height: @PopupContainerMaxHeight; overflow-y: auto;" @ref="_scrollableSelectDiv">
                <div>
                    <div class="" role="listbox" style="@ListboxStyle">
                        @if (CustomTagSelectOptionItem != null)
                        {
                            <CascadingValue Value="@ItemTemplate" Name="ItemTemplate">
                                <CascadingValue Value="@CustomTagSelectOptionItem" Name="Model">
                                    <SelectOption @key="@CustomTagSelectOptionItem.InternalId"
                                                  TItemValue="TItemValue"
                                                  TItem="TItem">
                                    </SelectOption>
                                </CascadingValue>
                            </CascadingValue>
                        }
                        @SelectOptions
                        @if (AddedTags != null)
                        {
                            foreach (var selectOption in AddedTags)
                            {
                                <CascadingValue Value="@ItemTemplate" Name="ItemTemplate">
                                    <CascadingValue Value="@selectOption" Name="Model">
                                        <SelectOption @key="@selectOption.InternalId"
                                                      TItemValue="TItemValue"
                                                      TItem="TItem">
                                        </SelectOption>
                                    </CascadingValue>
                                </CascadingValue>
                            }
                        }
                    </div>
                </div>
            </div>
    ;
        }
        else if (SelectOptions == null && !AllOptionsHidden())
        {
            return@<div class="" style="max-height: @PopupContainerMaxHeight; overflow-y: auto;" @ref="_scrollableSelectDiv">
                <div>
                    <div class="" role="listbox" style="@ListboxStyle">
                        @{
                            @if (!IsGroupingEnabled)
                            {
                                @SelectOptionsRender()
                            }
                            else
                            {
                                <CascadingValue Value="@ItemTemplate" Name="ItemTemplate">
                                    <SelectOptionGroup TItemValue="TItemValue" TItem="TItem"></SelectOptionGroup>
                                </CascadingValue>
                            }
                        }
                    </div>
                </div>
            </div>;
        }
        @if (AllOptionsHidden())
        {
            return@<div role="listbox" id="@(Id)_list" class="@ClassPrefix-item-empty">
                @if (NotFoundContent != null)
                {
                    @NotFoundContent
                }
                else
                {
                    <Empty Simple Small />
                }
            </div>
    ;
        }

        return builder => { };
    }

}
